/**
 * 
 */
package io.gitee.falllee.dao.persistence;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.cursor.Cursor;

/**
 * @author batty
 *
 */
@Mapper
public interface DataMapper {
    
    /**
     * 根据主键值查询
     * 
     * @param map 参数
     * @return 实体Map
     */
    Map<String, Object> selectByKey(Map<String, Object> map);

    /**
     * 根据字段值集合查询实体集合
     * 
     * @param map 参数
     * @return 实体Map集合
     */
    List<Map<String, Object>> selectByFieldList(Map<String, Object> map);

    /**
     * 根据条件查询
     * 
     * @param map 参数
     * @return 实体Map集合
     */
    List<Map<String, Object>> select(Map<String, Object> map);

    /**
     * 查询数量
     * 
     * @param map 参数
     * @return 数量
     */
    Long selectCount(Map<String, Object> map);

    /**
     * 统计字段
     * 
     * @param map 参数
     * @return 字段数量集合
     */
    List<Map<String, Object>> selectGroup(Map<String, Object> map);

    /**
     * 查询聚合
     * 
     * @param map 参数
     * @return 最小值
     */
    Object selectAggregate(Map<String, Object> map);

    /**
     * 查询唯一
     * 
     * @param map 参数
     * @return 唯一值集合
     */
    List<Object> selectDistinct(Map<String, Object> map);

    /**
     * 批量查询uuid
     * 
     * @param n 数目
     * @return 主键集合
     */
    List<String> selectUuid(Long n);

    /**
     * 插入
     * 
     * @param map 参数
     * @return 插入数量
     */
    Integer insert(Map<String, Object> map);

    /**
     * 插入,主键为UUID
     * 
     * @param map 参数
     * @return 插入数量
     */
    Integer insertUuid(Map<String, Object> map);

    /**
     * 插入,主键为自增序列
     * 
     * @param map 参数
     * @return 插入数量
     */
    Integer insertAuto(Map<String, Object> map);

    /**
     * 插入,主键为自增序列(oracle)
     * 
     * @param map 参数
     * @return 插入数量
     */
    Integer insertAuto4Oracle(Map<String, Object> map);

    /**
     * 批量插入
     * 
     * @param map  参数
     * @param list 参数
     * @return 插入数量
     */
    Integer insertList(@Param("map") Map<String, Object> map, @Param("list") List<Map<String, Object>> list);

    /**
     * 批量插入,主键为自增序列
     * 
     * @param map  参数
     * @param list 参数
     * @return 插入数量
     */
    Integer insertAutoList(@Param("map") Map<String, Object> map, @Param("list") List<Map<String, Object>> list);

    /**
     * 获取oracle序列值
     * 
     * @param sequence 序列名称
     * @return 序列值
     */
    Long getOracleSerialNumber(@Param("sequence") String sequence);

    /**
     * 批量插入(Oracle)
     * 
     * @param map  参数
     * @param list 参数
     * @return 插入数量
     */
    @SuppressWarnings("rawtypes")
    Integer insertList4Oracle(@Param("map") Map<String, Object> map, @Param("list") List list);

    /**
     * 更新
     * 
     * @param map 参数
     * @return 更新数量
     */
    Integer update(Map<String, Object> map);

    /**
     * 批量更新
     * 
     * @param genMap   参数
     * @param keyList  主键集合
     * @param paramMap 参数
     * @return 更新数量
     */
    Integer updateBatch(@Param("genMap") Map<String, Object> genMap, @Param("keyList") List<Object> keyList,
        @Param("paramMap") Map<String, List<Map<Object, Object>>> paramMap);

    /**
     * 逻辑删除
     * 
     * @param map 参数
     * @return 删除数量
     */
    Integer deleteLogic(Map<String, Object> map);

    /**
     * 物理删除
     * 
     * @param map 参数
     * @return 删除数量
     */
    Integer delete(Map<String, Object> map);

    /**
     * 还原逻辑删除的数据
     * 
     * @param map 参数
     * @return 还原数量
     */
    Integer restore(Map<String, Object> map);

    /**
     * 执行sql(更新、删除等sql)
     * 
     * @param map
     * @return
     */
    Integer executeSql(Map<String, Object> map);
    
    /**
     * 流式查询
     * 
     * @param map
     * @return
     */
    Cursor<Map<String, Object>> selectStreaming(Map<String, Object> map);
    
    /**
     * 游标查询
     * 
     * @param map
     * @return
     */
    Cursor<Map<String, Object>> selectCursor(Map<String, Object> map);
}
